#include"SeqList.h"

void SLInit(SL* sl)
{
	assert(sl);
	sl->data = NULL;
	sl->size = sl->capacity = 0;
}

void SLDestroy(SL* sl)
{
	assert(sl);
	free(sl->data);
	sl->data = NULL;
	sl->size = sl->capacity = 0;
}

void SLApply(SL* sl)
{
	assert(sl);
	if (sl->size == sl->capacity)
	{
		int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(sl->data, sizeof(SLDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc failed!");
			return;
		}
		sl->data = tmp;
		sl->capacity = newcapacity;
	}
}

//void SLPrint(SL sl)
//{
//	for (int i = 0; i < sl.size; i++)
//	{
//		printf("%d ", sl.data[i]);
//	}
//	printf("\n");
//}

void SLPushBack(SL* sl, SLDataType x)
{
	assert(sl);
	SLApply(sl);
	sl->data[sl->size++] = x;
}

void SLPushFront(SL* sl, SLDataType x)
{
	assert(sl);
	SLApply(sl);
	for (int i = sl->size; i >= 1; i--)
	{
		sl->data[i] = sl->data[i - 1]; // data[1] = data[0]
	}
	sl->data[0] = x;
	sl->size++;
}

void SLPopBack(SL* sl)
{
	assert(sl);
	assert(sl->size > 0);
	sl->size--;
}

void SLPopFront(SL* sl)
{
	assert(sl);
	assert(sl->size > 0);
	for (int i = 0; i <= sl->size - 1; i++)
	{
		sl->data[i] = sl->data[i + 1];//data[size - 2] = data[size - 1]
	}
	sl->size--;
}

void SLInsert(SL* sl, int pos, SLDataType x)
{
	assert(sl);
	assert(pos >= 0 && pos <= sl->size);
	for (int i = sl->size; i >= pos + 1; i--)
	{
		sl->data[i] = sl->data[i - 1];//data[pos+1] = data[pos]
	}
	sl->data[pos] = x;
	sl->size++;
}

void SLDelete(SL* sl, int pos)
{
	assert(sl);
	assert(pos >= 0 && pos < sl->size);
	for (int i = pos; i <= sl->size - 1; i++)
	{
		sl->data[i] = sl->data[i + 1];//data[size - 1] = data[size]
	}
	sl->size--;
}

//int SLFind(SL* sl, int pos)
//{
//	assert(sl);
//	for (int i = 0; i < sl->size; i++)
//	{
//		if (sl->data[i] == pos)
//		{
//			return i;
//		}
//	}
//	return -1;
//}